package com.mig.coins.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import com.mig.coins.db.Consultas;

public class Catalogo extends Consultas {
	
	private long id = 0;
	private int tipo = 0;
	private long pedido = 0;
	private String observaciones = null;
	private long _pais = 0;
	private String ceca = null;
	private int year = 0;
	private String estrella = null;
	private long _divisa = 0;
	private double facial = 0.0;
	private int ordenAux = 0;
	private String modelo = null;
	private String KM = null;
	private boolean cartera = false;
	private String anverso = null;
	private String reverso = null;

	private final static String GET_MONEDA_SQL = "SELECT " +
	"  `catalogo`.`id`, `catalogo`.`tipo`, `catalogo`.`pedido`, `catalogo`.`observaciones`, " +
	"  `catalogo`.`pais`, `catalogo`.`ceca`, `catalogo`.`year`, " +
	"  `catalogo`.`estrella`, `catalogo`.`divisa`, `catalogo`.`facial`, `catalogo`.`orden_aux`, " +
	"  `catalogo`.`modelo`, `catalogo`.`km`, `catalogo`.`cartera`, `catalogo`.`anverso`, `catalogo`.`reverso` " +
	"FROM `catalogo` ";

	public Long insert(Connection conn) {
		// Validaciones para insertar
		// Insertar
		// Obtiene el id y lo guarda
		return null;
	}

	public boolean delete(Connection conn) {
		return false;
	}

	public boolean update(Connection conn) {
		return false;
	}


	public static Catalogo readMoneda(Connection conn, Long _id) throws SQLException {
		Catalogo _moneda = new Catalogo(); 
		PreparedStatement stmt=null;
		ResultSet rs = null;

		stmt=conn.prepareStatement(GET_MONEDA_SQL + " WHERE `catalogo`.`id`=?");
		stmt.setLong(1, _id.longValue());
		rs = stmt.executeQuery();
		if (rs.next()) 
			_moneda.loadMonedaFromResultSet(rs, 0);
		else 
			_moneda = null;

		if (rs != null) rs.close();
		if (stmt != null) stmt.close(); 

		return _moneda;
	}

	public static ArrayList<Catalogo> searchMonedas(Connection conn, String where, String sort) throws SQLException {
		String query = GET_MONEDA_SQL;
		if ((where != null) && (where.trim().length()>0)) {
			query +="WHERE " + where + " ";
		}
		if ((sort != null) && (sort.trim().length()>0)) {
			query +=" ORDER BY " + sort + " ";
		}
		// Creamos el Statement y el ResultSet.
		Statement stm = conn.createStatement();
		ResultSet rs = stm.executeQuery(query);
	
		// Procesamos el ResultSet.
		ArrayList<Catalogo> lMonedas = null;
		while (rs.next()) {
			Catalogo _moneda = new Catalogo();
			_moneda.loadMonedaFromResultSet(rs, 0);
			if (null == lMonedas)
				lMonedas = new ArrayList<Catalogo>();
			lMonedas.add(_moneda);
		}
		rs.close();
		stm.close();
		return lMonedas;
	}

	public static ArrayList<Catalogo> findMonedaByLogicalKey(Connection conn, int pais, String ceca,
			int year, String estrella, int divisa, double facial, int orden) throws SQLException {
		String where = "(`tipo` = " + TipoCatalogo.TIPO_MONEDA;
		
		  where += ") AND (`pais` = " + pais;

		  if (null == ceca)
			  where += ") AND (`ceca` IS NULL";
		  else
			  where += ") AND (`ceca` = '" + ceca + "'";
			  
		  where += ") AND (`year` = " + year;

		  if (null == estrella)
			  where += ") AND (`estrella` IS NULL";
		  else
			  where += ") AND (`estrella` = '" + estrella + "'";
		  
		  where += ") AND (`divisa` = " + divisa;
		  
		  where += ") AND (`facial` = " + facial;
		  
		  where += ") AND (`orden_aux` = " + orden;

		  where += ")";
		
		return searchMonedas(conn, where, null);
	}

	public void loadMonedaFromResultSet(ResultSet rs, int incr) throws SQLException {
		this.id = rs.getLong(1 + incr);
		this.tipo = rs.getInt(2 + incr);
		this.pedido = rs.getLong(3 + incr);
		this.observaciones = rs.getString(4 + incr);
		this._pais = rs.getLong(5 + incr);
		this.ceca = rs.getString(6 + incr);
		this.year = rs.getInt(7 + incr);
		this.estrella = rs.getString(8 + incr);
		this._divisa = rs.getLong(9 + incr);
		this.facial = rs.getDouble(10 + incr);
		this.ordenAux = rs.getInt(11 + incr);
		this.modelo = rs.getString(12 + incr);
		this.KM = rs.getString(13 + incr);
		this.cartera = rs.getBoolean(14 + incr);
		this.anverso = rs.getString(15 + incr);
		this.reverso = rs.getString(16 + incr);
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public long getPais() {
		return _pais;
	}

	public void setPais(long pais) {
		this._pais = pais;
	}

	public String getCeca() {
		return ceca;
	}

	public void setCeca(String ceca) {
		this.ceca = ceca;
	}

	public int getYear() {
		return year;
	}

	public void setYear(int year) {
		this.year = year;
	}

	public String getEstrella() {
		return estrella;
	}

	public void setEstrella(String estrella) {
		this.estrella = estrella;
	}

	public long getDivisa() {
		return _divisa;
	}

	public void setDivisa(long divisa) {
		this._divisa = divisa;
	}

	public double getFacial() {
		return facial;
	}

	public void setFacial(double facial) {
		this.facial = facial;
	}

	public int getOrdenAux() {
		return ordenAux;
	}

	public void setOrdenAux(int ordenAux) {
		this.ordenAux = ordenAux;
	}

	public String getModelo() {
		return modelo;
	}

	public void setModelo(String modelo) {
		this.modelo = modelo;
	}

	public String getKM() {
		return KM;
	}

	public void setKM(String km) {
		KM = km;
	}

	public String getObservaciones() {
		return observaciones;
	}

	public void setObservaciones(String observaciones) {
		this.observaciones = observaciones;
	}
	
	public int getTipo() {
		return tipo;
	}
	
	public void setTipo(int tipo) {
		this.tipo = tipo;
	}

	public long getPedido() {
		return pedido;
	}

	public void setPedido(long pedido) {
		this.pedido = pedido;
	}

	public boolean isCartera() {
		return cartera;
	}

	public void setCartera(boolean cartera) {
		this.cartera = cartera;
	}

	public String getAnverso() {
		return anverso;
	}

	public void setAnverso(String anverso) {
		this.anverso = anverso;
	}

	public String getReverso() {
		return reverso;
	}

	public void setReverso(String reverso) {
		this.reverso = reverso;
	}
	
}
